import { ComputedRef } from 'vue';
import { VxeModalInstance, VxeModalPropTypes, ModalEventTypes } from 'vxe-pc-ui';
import { ButtonProps, ButtonType } from 'ant-design-vue/es/button/buttonTypes';

/** 弹窗对外暴露的方法 */
export interface ModalMethods {
  /** 获取弹窗对象 */
  getModal: () => VxeModalInstance | undefined;
  /** 弹窗是否已打开 */
  isOpen: () => boolean;
  /** 设置弹窗参数 */
  setModalProps: (props: Partial<ModalProps>) => void;
}

/** 弹窗注册函数 */
export type RegisterFn = (modalMethods: ModalMethods, uuid: number) => void;

/** 弹窗注册返回的方法 */
export interface ReturnMethods extends ModalMethods {
  getOpen?: ComputedRef<boolean>;
  /** 打开弹窗 */
  openModal: <T = any>(props?: boolean, data?: T, openOnSet?: boolean) => void;
  /** 关闭弹窗 */
  closeModal: () => void;
}

/** UseModal返回的类型 */
export type UseModalReturnType = [RegisterFn, ReturnMethods];

/** UseModalInner返回的方法 */
export interface ReturnInnerMethods extends ModalMethods {
  getOpen?: ComputedRef<boolean>;
  /** 关闭弹窗 */
  closeModal: () => void;
  /** 更改弹窗加载状态 */
  changeLoading: (loading: boolean) => void;
  /** 更改取消按钮加载状态 */
  changeCancelLoading: (loading: boolean) => void;
  /** 更改确定按钮加载状态 */
  changeOkLoading: (loading: boolean) => void;
}

/** UseModalInner返回的类型 */
export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods];

/** vxe-modal参数 */
export interface VxeModalProps {
  /** 设置唯一的 id（对于 Message 防止重复弹出 或 Storage 拖动状态保存等场景可能会用到） */
  id?: string;
  /** 尺寸 */
  size?: VxeModalPropTypes.Size;
  /** 窗口类型 */
  type?: VxeModalPropTypes.Type;
  /** 是否加载中 */
  loading?: boolean;
  /** 给窗口附加 className */
  className?: string;
  /** 是否显示头部 */
  showHeader?: boolean;
  /** 是否显示底部 */
  showFooter?: boolean;
  /** 是否锁住页面，不允许窗口之外的任何操作。 */
  lockView?: boolean;
  /** 是否锁住滚动条，不允许页面滚动。 */
  lockScroll?: boolean;
  /** 是否显示遮罩层 */
  mask?: boolean;
  /** 是否允许点击遮罩层关闭窗口 */
  maskClosable?: boolean;
  /** 是否允许按 Esc 键关闭窗口 */
  escClosable?: boolean;
  /** 标题是否标显示最大化、最小化与还原按钮 */
  showZoom?: boolean;
  /** 是否显示关闭按钮 */
  showClose?: boolean;
  /** 只对 type=modal 有效，是否允许通过双击头部放大或还原窗口 */
  dblclickZoom?: boolean;
  /** 是否启用窗口拖动 */
  draggable?: boolean;
  /** 是否允许窗口边缘拖动调整窗口大小 */
  resize?: boolean;
  /** 窗口的宽度 */
  width?: string | number;
  /** 窗口的高度 */
  height?: string | number;
  /** 窗口的最小宽度 */
  minWidth?: string | number;
  /** 窗口的最小高度 */
  minHeight?: string | number;
  /** 窗口的最大宽度 */
  maxWidth?: string | number;
  /** 窗口的最大高度 */
  maxHeight?: string | number;
  /** 只对 type=modal 有效，窗口的默认位置，可以设置为 center 居中显示。 */
  position?: VxeModalPropTypes.Position;
  /** 自定义堆叠顺序（对于某些特殊场景，比如被遮挡时可能会用到） */
  zIndex?: number;
  /** 设置标题内容过长时显示为省略号 */
  showTitleOverflow?: boolean;
  /** 是否将弹框容器插入于 body 内 */
  transfer?: boolean;
  /** 窗口打开时自动最大化显示 */
  fullscreen?: boolean;
  /** 记忆功能，会记住最后操作状态，再次打开窗口时还原窗口状态 */
  remember?: boolean;
  /** 在窗口关闭时销毁内容 */
  destroyOnClose?: boolean;
  /** 是否启用 localStorage 本地保存，会将窗口拖动的状态保存到本地（需要有 id） */
  storage?: boolean;
}
/** 弹窗参数 */
export interface ModalProps extends VxeModalProps {
  /** 是否打开 */
  open?: boolean;
  /** 窗口的标题 */
  title?: string;
  /** 窗口标题右侧的提示信息 */
  helpMessage?: string | string[];
  /** 显示取消按钮 */
  showCancel?: boolean;
  /** 取消按钮类型 */
  cancelType?: ButtonType;
  /** 取消按钮加载中 */
  cancelLoading?: boolean;
  /** 取消按钮文字 */
  cancelText?: string;
  /** 取消按钮参数 */
  cancelButtonProps?: ButtonProps;
  /** 显示确认按钮 */
  showOk?: boolean;
  /** 确认按钮类型 */
  okType?: ButtonType;
  /** 确认按钮加载中 */
  okLoading?: boolean;
  /** 确认按钮文字 */
  okText?: string;
  /** 确认按钮参数 */
  okButtonProps?: ButtonProps;
  /** 关闭方法，返回 false 阻止关闭。 */
  closeFunc?: (params: { type: ModalEventTypes }) => Promise<boolean>;
  /** 窗口关闭后回调 */
  afterClose?: () => Promise<VueNode>;
}

/** 弹窗参数类型 */
export type ModalPropsType = ModalProps;

/** vxe-modal参数名称列表 */
export const VxeModalPropNames = [
  /** 尺寸 */
  'size',
  /** 是否加载中 */
  'loading',
  /** 设置唯一的 id（对于 Message 防止重复弹出 或 Storage 拖动状态保存等场景可能会用到） */
  'id',
  /** 窗口的标题（支持开启国际化） */
  'title',
  /** 窗口类型 */
  'type',
  /** 只对 type=alert,confirm,message 有效，消息状态 */
  'status',
  /** 给窗口附加 className */
  'className',
  /** 自定义状态图标 */
  'iconStatus',
  /** 显示的文本（支持开启国际化） */
  'content',
  /** 是否显示取消按钮 */
  'showCancelButton',
  /** 只对 type=confirm 有效，取消按钮的文本内容 */
  'cancelButtonText',
  /** 是否显示确认按钮 */
  'showConfirmButton',
  /** 只对 type=alert 有效，确认按钮的文本内容 */
  'confirmButtonText',
  /** 是否显示头部 */
  'showHeader',
  /** 是否显示底部 */
  'showFooter',
  /** 是否锁住页面，不允许窗口之外的任何操作。 */
  'lockView',
  /** 是否锁住滚动条，不允许页面滚动。 */
  'lockScroll',
  /** 是否显示遮罩层 */
  'mask',
  /** 是否允许点击遮罩层关闭窗口 */
  'maskClosable',
  /** 是否允许按 Esc 键关闭窗口 */
  'escClosable',
  /** 是否显示最大化按钮 */
  'showMaximize',
  /** 是否显示最小化按钮 */
  'showMinimize',
  /** 是否显示最大化与最小化按钮 */
  'showZoom',
  /** 是否显示关闭按钮 */
  'showClose',
  /** 是否允许窗口边缘拖动调整窗口大小 */
  'resize',
  /** 只对 resize 启用后有效，用于设置可拖动界限范围，如果为负数则允许拖动超出屏幕边界 */
  'marginSize',
  /** 只对 type=message 有效，自动关闭的延时，如果为 -1 禁用自动关闭 */
  'duration',
  /** 窗口的宽度 */
  'width',
  /** 窗口的高度 */
  'height',
  /** 窗口的最小宽度 */
  'minWidth',
  /** 窗口的最小高度 */
  'minHeight',
  // /** 窗口的最大宽度 */
  // 'maxWidth',
  // /** 窗口的最大高度 */
  // 'maxHeight',
  /** 只对 type=message 有效，消息距离顶部的位置 */
  'top',
  /** 只对 type=modal 有效，窗口的默认位置，可以设置为 center 居中显示。 */
  'position',
  /** 自定义堆叠顺序（对于某些特殊场景，比如被遮挡时可能会用到） */
  'zIndex',
  /** 设置标题内容过长时显示为省略号 */
  'showTitleOverflow',
  /** 是否将弹框容器插入于 body 内 */
  'transfer',
  /** 窗口打开时自动最大化显示 */
  'fullscreen',
  /** 是否启用窗口拖动 */
  'draggable',
  /** 只对 type=modal 有效，是否允许通过双击头部放大或还原窗口 */
  'dblclickZoom',
  /** 记忆功能，会记住最后操作状态，再次打开窗口时还原窗口状态 */
  'remember',
  /** 在窗口关闭时销毁内容 */
  'destroyOnClose',
  /** 是否启用 localStorage 本地保存，会将窗口拖动的状态保存到本地（需要有 id） */
  'storage',
  /** 在窗口隐藏之前执行，可以返回 Error 阻止关闭，支持异步 */
  'beforeHideMethod',
];
/** 弹窗参数名称列表 */
export const ModalPropNames = [
  /** 是否打开 */
  'open',
  /** 窗口的标题 */
  'title',
  /** 窗口标题右侧的提示信息 */
  'helpMessage',
  /** 显示取消按钮 */
  'showCancel',
  /** 取消按钮类型 */
  'cancelType',
  /** 取消按钮加载中 */
  'cancelLoading',
  /** 取消按钮文字 */
  'cancelText',
  /** 取消按钮参数 */
  'cancelButtonProps',
  /** 显示确认按钮 */
  'showOk',
  /** 确认按钮类型 */
  'okType',
  /** 确认按钮加载中 */
  'okLoading',
  /** 确认按钮文字 */
  'okText',
  /** 确认按钮参数 */
  'okButtonProps',
  /** 关闭方法，返回 false 阻止关闭。 */
  'closeFunc',
  /** 窗口关闭后回调 */
  'afterClose',
];
